{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 88,
   "id": "ee0668c5-eef3-4bec-9c8f-859b25d2a257",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 升维 解决欠拟合问题的数据预处理技术\n",
    "# 当数据非线性时，但要用线性算法处理时，需要将非线性数据升维成线性数据\n",
    "# 比如2元线性函数，自乘可升维到5维 x1 x2 x1方 x2方 x1x2   即2元多项式升维"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "id": "c28e5cd1-e02d-438a-9520-4f2702d50c8a",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.preprocessing import PolynomialFeatures # 进行多项式升维  特征预处理\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.metrics import mean_squared_error # 评估升维效果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "id": "98305bc0-7999-40cb-9948-28977a38b921",
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(12)\n",
    "m=100\n",
    "x=6*np.random.rand(m,1)-3 #数据范围-3到3\n",
    "y=2+x+0.5*x**2+np.random.randn(m,1) #线性回归一般处理x阶为1的，这里时2次"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "id": "cee16173-6735-47c3-929d-e658628744dd",
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train=x[:80] # 取前80行为训练数据\n",
    "y_train=y[:80]\n",
    "x_test=x[80:]\n",
    "y_test=y[80:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "id": "0ceead16-ce37-4de1-bb1a-4886831a0df5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-2.07502295]\n",
      "[ 1.         -2.07502295]\n",
      "(80, 1)\n",
      "(80, 2)\n",
      "0.0 [[3.45123698 0.97735283]]\n",
      "3.2811428409987613\n",
      "3.1637494221438125\n",
      "\n",
      "\n",
      "[-2.07502295]\n",
      "[ 1.         -2.07502295  4.30572023]\n",
      "(80, 1)\n",
      "(80, 3)\n",
      "0.0 [[1.92785521 1.06096313 0.49015886]]\n",
      "1.1755947475795974\n",
      "1.0565086476466978\n",
      "\n",
      "\n",
      "[-2.07502295]\n",
      "[ 1.00000000e+00 -2.07502295e+00  4.30572023e+00 -8.93446827e+00\n",
      "  1.85392267e+01 -3.84693207e+01  7.98247232e+01 -1.65638132e+02\n",
      "  3.43702925e+02 -7.13191456e+02  1.47988864e+03]\n",
      "(80, 1)\n",
      "(80, 11)\n",
      "0.0 [[ 2.10302979e+00  8.90730871e-01 -5.73574662e-01 -2.33867197e-01\n",
      "   8.76802019e-01  1.86475653e-01 -2.53966166e-01 -3.70553386e-02\n",
      "   3.06821981e-02  2.21605184e-03 -1.32256870e-03]]\n",
      "1.116056580611215\n",
      "1.0707955035760672\n",
      "\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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f99wgpaOn46FbSxgW3It2mZkygclAf11ozEi/WoMyCiCXj/ca5cLICeXNjfLj9/crM1kU4AJp0RERBGJJrEz6G4Uj3oea6zukunumh5wVzYFcPbZHRDFjOi/IYUw4ZSIiChG+prYaTa7Aw9Avqys9JgBefBBVz0P4+twL634llLvSTLVUuARKSacEhERRaCviZ3BghbfGRPryfCa5fDkmWSaqDjzQUREFIG+JnY6gxZPnkHL4T9Mxv5P70brp3fj6AnKj1tLFA8+uru78de//hWjR49Gv379MGbMGNx1111w+IZ7RERECaqviZ1VVe4AxDdo2bT3AmztuB1fddzuvoNPVqa/JNNEpPiyy3333Ycnn3wSzz77LE4++WRs3LgRV199NbKzs3HjjTcq/XRERERxYTKFv43VN9H0z38GbrzR+/65uddi374n5Cs+eR4AYDTORWHhwwmd6+Gk+G6XX/3qV8jJyUGtx76jX//61+jfvz+ef/75kPfnbhciIkomkeyOaW19AV99dXmvxygqqkNOziyvx9yxQ17K0Uodj7judjnrrLPw/vvvY/v27QCAzz//HB9//DHOPfdcv+d3dnbCarV6fRERUWJLhM6qalG67Hk0NUa0QvHgY8GCBZg5cybGjRsHvV6PM844A/Pnz8fMmTP9nr948WJkZ2e7vvLz85UeEhERqSgZ3hyVFCrR1JPBMBaACFHsj2HDfgdR7A9A7DkexnbdBKH4ssuKFStw00034YEHHsDJJ5+MpqYmzJ8/H0uWLMHs2bN7nd/Z2YnOzk7XdavVivz8fC67EBEloHh3VtWq2lo5SLDb3YmmgZJUu7utEMWBEEURDocDDscRpKXJ74f19XJQ56u+Higri934wxHJsoviCac33XQTbrnlFlx22WUAgFNPPRW7d+/G4sWL/QYfGRkZyMhI/OQZIiKKrJZFKikvB6ZPl1+HgoLgr4Uz0AAAURQhiu7ridQ8LhjFl12+//57iD7zSzqdjlttiYhSQCRLDKnGZJJnJ6IJwhKpeVwwis98nH/++bjnnnswYsQInHzyydi0aROWLFmCa665RumnIiIijXG+OfouMSTam6OWRTKLolWK53zYbDbcfvvtWLlyJdra2pCbm4uZM2fijjvuQHp6esj7c6stEVHiM5sT+81RcRaLHIVVVgJGY7xHExORvH+zqy0REVGs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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "d={1:'g-',2:'r+',10:'y*'} # 创建字典 y*表示黄颜色*画图\n",
    "for i in d: # for循环遍历字典d\n",
    "    poly_features=PolynomialFeatures(degree=i,include_bias=True) # 包括截距项\n",
    "    x_poly_train=poly_features.fit_transform(x_train) # 1元 2元 10元多项式升维\n",
    "    x_poly_test=poly_features.fit_transform(x_test)\n",
    "    print(x_train[0]) # 打印第1行数据，下标0\n",
    "    print(x_poly_train[0])\n",
    "    print(x_train.shape)\n",
    "    print(x_poly_train.shape)\n",
    "    linear_reg=LinearRegression(fit_intercept=False)\n",
    "    linear_reg.fit(x_poly_train,y_train)\n",
    "    print(linear_reg.intercept_,linear_reg.coef_)\n",
    "    y_train_predict=linear_reg.predict(x_poly_train)\n",
    "    y_test_predict=linear_reg.predict(x_poly_test)\n",
    "    plt.plot(x_poly_train[:,1],y_train_predict,d[i]) # 打印第2列数据，即下标为1的x1 高纬度画图不便  d[i]取字典中的颜色和标识\n",
    "    print(mean_squared_error(y_train,y_train_predict)) #计算训练集误差MSE\n",
    "    print(mean_squared_error(y_test,y_test_predict)) #计算测试集误差MSE\n",
    "    \n",
    "    print('\\n')\n",
    "plt.plot(x,y,'b.') # 传初始x,y参数  放在for外部，但在一个代码块，可4图合1\n",
    "plt.show() "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "id": "e088829d-bfee-4ce2-b811-72c0cb9afc78",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 升维后 最左边1是添加的截距项x0=1\n",
    "# d=1  结果x0 x1\n",
    "# d=2  结果x0 x1 x2=x1**2\n",
    "# d=10 结果x0 x1 x2=x1**2............x10=x1**10\n",
    "#因为初始数据就x1一项，因此升维就是x0,加上x1的高次,低维数据都保留\n",
    "#若原始数据有x1,x2 ,d=2时，则有x0 x1 x2 x1**2  x2**2 x1x2 6项\n",
    "# 3轮for循环  便于对比结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "id": "5aab70d5-5366-4b79-9b5e-f5c94dbb86a3",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 根据MSE结果\n",
    "# di=1时  训练集，测试集MSE都较大  欠拟合\n",
    "# di=2时  训练集MSE比di=10时稍大，测试集MSE比di=10稍小   拟合适度\n",
    "# di=10时 训练集MSE比di=2时稍小，测试集MSE比di=2稍大   拟合过度 即测试集精度高，但泛化能力较差\n",
    "# 本例di=2和di=10相差不大，理解原理就行  但给的y是2元的，则结果为2元拟合适中符合目标\n",
    "# 线性回归也可以拟合高维"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "409a14ef-93ed-4378-8996-2a5618bfb44e",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
